home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / develop™ Technical Journal / develop Issue 20 code / Newton Q&A code < prev    next >
Encoding:
Text File  |  1994-10-14  |  3.7 KB  |  127 lines  |  [TEXT/MPS ]

  1. develop    Newton Q&A    Draft 2.3    10/14/94    Page 1
  2.  
  3.  
  4. /* Some code to generate the table used in IsASCIIAlpha4
  5. call func() begin
  6.     s := Array(127, nil);    // ASCII is 7 bit, so only need 127
  7.     for i := 0 to 255 do begin
  8.         local c := chr(i);
  9.         if (c >= $a and c <= $z) or (c >= $A and c <= $Z) then
  10.             s[i] := TRUE;
  11.     end;
  12.     s
  13. end with ();
  14. */
  15.  
  16. IsASCIIAlpha1 := func(s)
  17. begin
  18.     local c := Upcase(Clone(s)) ;
  19.     local i ;
  20.  
  21.     for i := 0 to StrLen(c) - 1 do
  22.         if (StrCompare(SubStr(c, i, 1), "A") < 0) OR
  23.             (StrCompare(SubStr(c, i, 1), "Z") > 0) then
  24.             return nil ;
  25.     true ;
  26. end;
  27.  
  28. IsASCIIAlpha2 := func(s)
  29. begin
  30.     local i ;
  31.     local c ;
  32.  
  33.     for i := 0 to StrLen(s) - 1 do
  34.     begin
  35.         // the assignment of the current character to the local c 
  36.         // is inlined in the first compare, this is faster.
  37.         if not(((c := s[i]) >= $A AND c <= $Z) OR
  38.             (c >= $a AND c <= $z)) then
  39.             return nil ;
  40.     end;
  41.     true ;
  42. end;
  43.  
  44. IsASCIIAlpha3 := func(s)
  45. begin
  46.     local i ;
  47.     local c := Upcase(Clone(s)) ;
  48.  
  49.     for i := 0 to StrLen(c) - 1 do
  50.         if (c[i] < $A) OR (c[i] > $Z)  then
  51.             return nil ;
  52.     true ;
  53. end;
  54.  
  55. // this table was generated using the code above, simple cut
  56. // and paste :-)
  57. constant kAlphaTable := '[NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, NIL, NIL, NIL, NIL, NIL, NIL, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, NIL, NIL, NIL, NIL];
  58.  
  59.  
  60. IsASCIIAlpha4 := func(s) begin
  61.     try
  62.         for i := 0 to StrLen(s)-1 do
  63.             if not kAlphaTable[ord(s[i])] then
  64.                 return NIL;
  65.         TRUE;
  66.  
  67.     // this code only handles first 127 characters, if the string
  68.     // contains a unicode character, the index will be
  69.     // out of the bounds of the array. Instead of checking
  70.     // the bounds in each loop iteration, use an exception
  71.     // handler. This ads no time to the loop, but a bit of setup
  72.     // time for the exception    
  73.     OnException |evt.ex.fr;type.ref.frame| do
  74.         if ord(s[i]) > 127 then
  75.             nil;
  76.         else
  77.             rethrow();
  78. end;
  79.  
  80. call func()
  81. begin
  82.     local longPass := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  83.     local longFail := longPass & " ";
  84.  
  85.     local timeFunc := func(targetFunc, s1, s2)
  86.         begin
  87.             local t := Ticks() ;
  88.             for i := 1 to 100 do
  89.             begin
  90.                 call targetFunc with (s1) ;
  91.                 call targetFunc with (s2) ;
  92.             end; 
  93.             Ticks() - t ;
  94.         end;
  95.         
  96.     Print("Long Strings ---------------") ;
  97.  
  98.     print("IsASCIIAlpha1: " & call timeFunc with (IsASCIIAlpha1, longPass, longFail)) ;    
  99.     print("IsASCIIAlpha2: " & call timeFunc with (IsASCIIAlpha2, longPass, longFail)) ;
  100.     print("IsASCIIAlpha3: " & call timeFunc with (IsASCIIAlpha3, longPass, longFail)) ;
  101.     print("IsASCIIAlpha4: " & call timeFunc with (IsASCIIAlpha4, longPass, longFail)) ;
  102.  
  103.     Print("\nShort Strings --------------") ;
  104.  
  105.     print("IsASCIIAlpha1: " &
  106.         call timeFunc with (IsASCIIAlpha1, "a", "a ")) ;    
  107.     print("IsASCIIAlpha2: " &
  108.         call timeFunc with (IsASCIIAlpha2, "a", "a ")) ;
  109.     print("IsASCIIAlpha3: " &
  110.         call timeFunc with (IsASCIIAlpha3, "a", "a ")) ;
  111.     print("IsASCIIAlpha4: " &
  112.         call timeFunc with (IsASCIIAlpha4, "a", "a ")) ;
  113. end with () ;
  114.  
  115. "Long Strings ---------------"
  116. "IsASCIIAlpha1: 5078"
  117. "IsASCIIAlpha2: 2389"
  118. "IsASCIIAlpha3: 1981"
  119. "IsASCIIAlpha4: 1176"
  120. "
  121. Short Strings --------------"
  122. "IsASCIIAlpha1: 180"
  123. "IsASCIIAlpha2: 111"
  124. "IsASCIIAlpha3: 107"
  125. "IsASCIIAlpha4: 79"
  126. #2        NIL
  127.